package com.xiaoqi.store.service.impl;

import com.xiaoqi.store.dao.CateMapper;
import com.xiaoqi.store.dao.ProductMapper;
import com.xiaoqi.store.entity.CartEntity;
import com.xiaoqi.store.entity.CartVO;
import com.xiaoqi.store.entity.ProductEntity;
import com.xiaoqi.store.exception.impl.*;
import com.xiaoqi.store.service.CateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 * @Author Rookie Coder
 * @Description 购物车业务层接口
 * @Date
 **/
@Service
@Slf4j
public class CateServiceImpl implements CateService {

    @Autowired
    private CateMapper cateMapper;
    @Autowired
    private ProductMapper productMapper;

    /*
    * @Author xiaoqi
    * @Description  添加商品到购物车
    * @return
    **/
    @Override
    public void addProductToCart(Integer pid, Integer amount, Integer uidFromSession, String usernameFromSession) {

        // 查询pid的商品信息
        ProductEntity productEntity = productMapper.selectProductDetail(pid);
        if (productEntity == null){
            log.info("该商品不存在");
            throw new ProductNotFoundHot("该商品不存在");
        }
        if (productEntity.getStatus() == 3 || productEntity.getStatus()==2){
            log.info("该商品已被下架");
            throw new ProductNotFoundHot("该商品已被下架");
        }
        // 根据商品id和用户id查询购物车中商品信息
        ProductEntity userCartProductDetail = cateMapper.selectProductIsExist(pid, uidFromSession);
        // 封装日志信息
        CartEntity cartEntity = new CartEntity();
        cartEntity.setModifiedTime(new Date());
        cartEntity.setModifiedUser(usernameFromSession);
        // 如果不存在，直接添加进购物车
        if (userCartProductDetail == null){
            // 封装购物车信息
            cartEntity.setPid(pid);
            cartEntity.setUid(uidFromSession);
            cartEntity.setNum(amount);
            cartEntity.setPrice(productEntity.getPrice());
            cartEntity.setCreatedTime(new Date());
            cartEntity.setCreatedUser(usernameFromSession);
            int addProductToUserCateResult = cateMapper.addProductToUserCate(cartEntity);
            if (addProductToUserCateResult<=0){
                log.info("添加商品进购物车出现异常");
                throw new CartAddProductException("添加商品进购物车出现异常");
            }
        }
        // 如果商品存在，修改商品数量
        else {
            // 获取商品数量
            Integer num = userCartProductDetail.getNum();
            // 将原数量和新添加的数量加在一起
            Integer newProductMount = num + amount;
            // 修改购物车中的商品数量
            int updateCartMountResult = cateMapper.updateUserCartProductMount(pid, newProductMount);
            if (updateCartMountResult<=0){
                log.info("修改购物车数量出现错误");
                throw new CartUpdateMountException("添加购物车异常");
            }

        }

    }

    /*
    * @Author xiaoqi
    * @Description  查询用户所有的购物车记录
    * @return
    **/
    @Override
    public List<CartVO> selectUserAllCartsByUid(Integer uidFromSession, String usernameFromSession) {
        // 查询当前用户是否登录
        if (uidFromSession == null){
            log.info("当前用户未登录");
            // throw  new UserNotFondException("当前用户未登录");
        }
        // 查询出当前用户的所有购物车记录
        List<CartVO> getUserCarts = cateMapper.selectUserAllCartsByUid(uidFromSession);
        log.info("查询出的购物车记录"+getUserCarts);
        return getUserCarts;
    }

    /*
    * @Author xiaoqi
    * @Description  修改购物车中商品的数量
    * @return
    **/
    @Override
    public void updateCartMount(Integer cid, Integer uidFromSession) {
        // 根据cid查询当前购物车中的当前商品
        CartVO cartVO = cateMapper.selectProductIsExistByCid(cid);
        // 判断当前商品是否为null
        if (cartVO == null){
            log.info("当前购物车中没有这个商品");
            throw new CartNotFoundException("当前购物车中没有这个商品");
        }
        // 判断当前商品的uid和当前用户是否一致
        if (cartVO.getUid() != uidFromSession){
            log.info("当前用户非法");
            throw new CartUserIllegality("购物车中非法用户");
        }
        Integer updateNum = cartVO.getNum() + 1;
        // 更新日志信息
        Date  date = new Date();
        // 更新购物车数量
        int updateUserCartProductMountResult = cateMapper.updateUserCartProductMount(cartVO.getPid(), updateNum);
        if (updateUserCartProductMountResult<=0){
            log.info("更新数量失败");
            throw new CartUpdateMountException("更新数量失败");
        }

    }

    /*
    * @Author xiaoqi
    * @Description  根据指定商品id删除掉指定购物车商品
    * @return
    **/
    public void deleteUserCartByCid(){

    }

    /**
     * 根据若干个购物车数据id查询详情的列表
     * @param uid 当前登录的用户的id
     * @param cids 若干个购物车数据id
     * @return 匹配的购物车数据详情的列表
     */
    @Override
    public List<CartVO> getVOByCids(Integer uid, Integer[] cids) {
        List<CartVO> list = cateMapper.findVOByCids(cids);
        Iterator<CartVO> it = list.iterator();
        while (it.hasNext()) {
            CartVO cart = it.next();
            if (!cart.getUid().equals(uid)) {
                it.remove();
            }
        }
        return list;
    }
}
